/*
 * Quercia Luciano
 * Algoritmi e Strutture Dati
 * a.a. 2009-10
 */


#ifndef _NODOAN_H_
#define _NODOAN_H_


template <class T>
class NodoAn {
public:
	NodoAn();
	~NodoAn();

	typedef int posizione;

	//Operatori
	T getValue();
	posizione getPadre();
	posizione getFratelloDestro();
	posizione getPrimoFiglio();

	bool isPresente();
	void setPresente(bool);

	void setValue(T);
	void setPadre( posizione );
	void setFratelloDestro( posizione );
	void setPrimoFiglio( posizione );

private:
	T value;
	bool presente;
	posizione padre;
	posizione fratelloDestro;
	posizione primoFiglio;
};



/*****************************
 *        DEFINIZIONI        *
 *     dei metodi di Nodo    *
 *****************************/


template <class T>
NodoAn<T>::NodoAn() {
	padre = -1 ;
	fratelloDestro = -1 ;
	primoFiglio = -1 ;
	presente = false;
}


template <class T>
NodoAn<T>::~NodoAn() {}


template <class T>
T NodoAn<T>::getValue() {
	return value;
}


template <class T>
typename NodoAn<T>::posizione NodoAn<T>::getPadre() {
	return padre;
}


template <class T>
typename NodoAn<T>::posizione NodoAn<T>::getFratelloDestro() {
	return fratelloDestro;
}

template <class T>
typename NodoAn<T>::posizione NodoAn<T>::getPrimoFiglio() {
	return primoFiglio;
}

template <class T>
void NodoAn<T>::setValue(T elem) {
	value = elem ;
}


template <class T>
void NodoAn<T>::setPadre(typename NodoAn<T>::posizione i) {
	padre = i ;
}


template <class T>
void NodoAn<T>::setFratelloDestro(typename NodoAn<T>::posizione i) {
	fratelloDestro = i ;
}

template <class T>
void NodoAn<T>::setPrimoFiglio(typename NodoAn<T>::posizione i) {
	primoFiglio = i ;
}

template <class T>
bool NodoAn<T>::isPresente() {
	return presente;
}

template <class T>
void NodoAn<T>::setPresente(bool b) {
	presente = b;
}

#endif
